/* @flow */

import {ASSET_TYPES} from 'shared/constants'
import {isPlainObject, validateComponentName} from '../util/index'

/**
 * 2019-05-13
 * 1.const ASSET_TYPES = ['component', 'directive', 'filter'];
 * 2.给Vue增加静态方法：Vue.component
 * 3.给Vue增加静态方法：Vue.directive
 * 4.给Vue增加静态方法：Vue.filter
 */
export function initAssetRegisters(Vue: GlobalAPI) {
  /**
   * Create asset registration methods.
   */
  ASSET_TYPES.forEach(type => {
    Vue[type] = function (id: string,
                          definition: Function | Object): Function | Object | void {
      if (!definition) {
        return this.options[type + 's'][id]
      } else {
        /* istanbul ignore if */
        if (process.env.NODE_ENV !== 'production' && type === 'component') {
          validateComponentName(id)
        }
        if (type === 'component' && isPlainObject(definition)) {
          definition.name = definition.name || id
          definition = this.options._base.extend(definition)
        }
        if (type === 'directive' && typeof definition === 'function') {
          definition = {bind: definition, update: definition}
        }
        this.options[type + 's'][id] = definition
        return definition
      }
    }
  })
}
